import 'package:flutter/material.dart';

///常用数据类型
class DataType extends StatefulWidget {
  @override
  _DataTypeState createState() => _DataTypeState();
}

class _DataTypeState extends State<DataType> {
  @override
  Widget build(BuildContext context) {
    _numType();
    _stringType();
    _boolType();
    _listType();
    _mapType();
    _tips();
    return Container(
      child: Text("常用数据类型，请查看控制台输出"),
    );
  }


  ///数字类型
  void _numType() {
    //接受 浮点类型 ，也接受整行 ，他是数字类型的父类
    num num1 = -1.0;
    num num2 = 2;

    int int1 = 3; //只能接受整数

    double double1 = 1.68; //双精度

    print("num$num1 num:$num2 int$int1 double$double1");
    print(num1.abs()); //求绝对值
    print(num1.toInt()); //转换成整数
    print(num1.toDouble()); //转换double

  }
  ///字符串
  void _stringType(){
    String str1 = "字符串" , str2 = "马俊宝";  //可以用单引号 ，也可以用双引号
    String str3 = "mmmmm$str1$str2";
    String str4 = "mmmmm"+str1+str2+"=====";
    String str5 = "常用数据类型，控制台输出";
    print(str3);
    print(str4);

    //常用方法 截取字符串
    print(str5.substring(2,6));
    print(str5.indexOf("类型"));

    print(str5.startsWith("据类"));
    print(str5.replaceAll("常用" , "hhaha"));

  }

  ///布尔数据类型  Dart是强bool类型检查 ，只有bool 类型的值true 才被认为
  void _boolType() {
    bool success =true , fail = false;

    print(success);
    print(fail);
    print(success==fail);
    print(success || fail);
    print(success && fail);
  }

  ///List集合
  void _listType(){
    print("===============我是分割线=================");

    ///集合初始化方式  集合是范型 可以是任何数据类型
    List list = [1,"2","a",4]; //初始化时添加元素
    print(list);
    ///集合范型的用法
    List<int> list2 = [1,2,3,4]; //指定int 只能放int类型
    print(list2);
    //list2 =list;   type 'List<dynamic>' is not a subtype of type 'List<int>' 没有指定list的类型

    List list3 =[];
    list3.add("list3"); //和java差不多
    list3.addAll(list);
    //其他方法 都差不多 addAll 和java 没什么差异
    print(list3);
    ///集合生成函数用法
    List list4 = List.generate(3, (index) => index*2);
    print(list4);

    ///集合便利方式
    for (int i = 0; i < list4.length; i++) {
      print(list4[i]);
    }

    for(var o in list4){
      print(o);
    }

    list4.forEach((element) {
      print("===$element");
    });
  }

  ///Map 是key value 都可以是任何类型的对象 ，key唯一 ，如果一样 会覆盖
  void _mapType() {
    Map names ={"aaa":"aa" , "bbb" :"bb"};
    print(names);
    Map ages = {};

    ages["xiaoming"] = 17;
    ages["xiaohong"] = 18;
    print(ages);
    
    ///Map 遍历方式
    ages.forEach((key, value) { 
      print("$key , $value");
    });
    Map ages2 = ages.map((key, value) {
      //迭代生成一个心Map
      return MapEntry(value, key);
    });
    print(ages2);


    for(var key in ages.keys){
      print("$key ${ages[key]}");
    }

  /*  ages.keys.forEach((element) {
      print("$element");
    });*/

  }

  ///科普小知识 ：dynamic ，var ， object 三者的区别
  _tips(){
    ///dynamic Dart动态数据类型
    print("=================tips==================");
    //不会进行数据类型检查  使用会带来额外的隐患
    dynamic x= "majunbao";
    print(x.runtimeType);
    print(x);
    //x.foo();

    x = 123;
    print(x.runtimeType);
    print(x);

    ///var
    var a = "majunbao";
    print(a.runtimeType);
    print(a);

    //a=123;
    //var 和dynamic 不同 一旦被定义 不能被修改

    ///Object dart对象的基类
    Object ob1 = '1111';
    print(ob1.runtimeType);
    print(ob1);

    //最大的区别 ，在于检查上 dynamic不会检查 ，但是Object会检查
  }
}
